package com.zhj.edu.manager;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 访问第三方
 */
@Component
public class RedisManager {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 向String类型中添加持久化数据
     * @param key
     * @param value
     */
    public void addString(String key, String value){
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 向String类型中添加带有过期时间的数据
     * @param key
     * @param value
     */
    public void addString(String key, String value, long expire, TimeUnit timeUnit){
        stringRedisTemplate.opsForValue().set(key, value, expire, timeUnit);
    }

    /**
     * 从String类型中获取数据
     * @param key
     * @return
     */
    public String getString(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 从String类型中获取Object类型的数据
     * @param key
     * @return
     */
    public Object getObject(String key){
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 在ZSet中统计得分区间内的成员的个数有多少
     * @param zSetName
     * @param startScore
     * @param endScore
     * @return
     */
    public long countZSet(String zSetName, long startScore, long endScore) {
        return redisTemplate.opsForZSet().count(zSetName,startScore,endScore);
    }

    /**
     * 向ZSet中添加数据
     * @param name
     * @param key
     * @param score
     */
    public void addZSet(String name, String key, long score) {
        redisTemplate.opsForZSet().add(name,key,score);
    }

    /**
     * 向Set集合中添加数据
     * @param name
     * @param val
     */
    public void addSet(String name, String val) {
        redisTemplate.opsForSet().add(name,val);
    }

    /**
     * 判断这个key在Redis中是否存在
     * @param blackKey
     * @return
     */
    public boolean existsKey(String blackKey) {
        return redisTemplate.hasKey(blackKey);
    }

    /**
     * 获取集合中的所有成员
     * @param name
     * @return
     */
    public Set<String> getBySet(String name) {
        return redisTemplate.opsForSet().members(name);
    }

    /**
     * 通过得分区间找到得分内的所有成员
     * @param name
     * @param startScore
     * @param endScore
     */
    public Set<String> getMemberByStartScoreAndEndScore(String name, long startScore, long endScore) {
        return redisTemplate.opsForZSet().rangeByScore(name,startScore,endScore);
    }

    /**
     * 删除这个ZSet集合中指定成员的数据
     * @param name
     * @param sets
     */
    public void deleteZSet(String name, Set<String> sets) {
        Iterator<String> iterator = sets.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            //删除这个成员
            redisTemplate.opsForZSet().remove(name,next);
        }
    }
}
